多年以前一位老程序员告诉笔者代码片段(code snippets)是程序员的财富,他有一个 U 盘,里面装着他的财富。每当他需要切换电脑写代码的时候,他就会把把精心配置的字体、主题、代码片段等部署到新电脑上,然后开始高速编码。每次看他写代码都是一种享受,不过这是另一个故事了。
需求
多年之后,笔者也终于凑够了钱买了自己的 Mac,闲暇无事的时候也会写写代码祭奠下逝去的青春。但是某些时候总会觉得很别扭,例如感觉字体和单位的有细小的差距,或者一个代码片段怎么也按不出来——最后发现是没有在这台电脑配置这段代码片段。这种事发生的事情多了之后,就会感觉厌烦,同样的操作为什么得重复两次、三次?或者拿出吃了几年灰的 U 盘抽插在各地的电脑上人工同步?就不能有什么办法可以一次更改多次应用?笔者稍微一拍脑门,想到了今天的主角——iCloud Drive
为什么使用 iCloud Drive?
因为这是苹果本家的网盘,嵌入系统中,只要开启我们就无需关心上传下载,正如 OneDrive 在 Windows 一样,我们只需要把文件放进去,他就会自动开始上传,并在你的每一台苹果设备上同步。利用这点我们就能方便的做到在不同的设备上同步 Xcode 配置文件,无需手动同步或者上传下载。
########### MAIN ################## # check directory exist if [ ! -d "${cloud_backup_dir}" ]; then echo"${red}iCloud Drive备份路径不存在!${reset}" mkdir -p "${cloud_backup_dir}" echo"${green}自动创建iCloud Drive备份路径:${reset}${cloud_backup_dir}" else echo"${green}iCloud Drive备份路径:${reset}${cloud_backup_dir}" fi
if [ ! -d "${local_backup_dir}" ]; then echo"${red}本地备份路径不存在!${reset}" mkdir -p "${local_backup_dir}" echo"${green}自动创建本地备份路径:${reset}${local_backup_dir}" else echo"${green}本地备份路径:${reset}${cloud_backup_dir}" fi
# zip files cd"${xcode_dir}" zip -r "${cloud_backup_dir}/XcodeBackup+${now}.zip""${code_snippets}""${font_and_color_themes}""${key_bindings}" & zip -r "${local_backup_dir}/XcodeBackup+${now}.zip""${code_snippets}""${font_and_color_themes}""${key_bindings}" &
wait
# delete unnecessary backup files num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr${num} - 5` cd"${cloud_backup_dir}" ls -tr"${cloud_backup_dir}" | head -${num} | xargs rm fi
num=`ls -l "${local_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr${num} - 5` cd"${local_backup_dir}" ls -tr"${local_backup_dir}" | head -${num} | xargs rm fi
########### MAIN ################## # check directory exist if [ ! -d "${cloud_backup_dir}" ]; then echo"${red}iCloud Drive备份路径不存在!${reset}" mkdir -p "${cloud_backup_dir}" echo"${green}自动创建iCloud Drive备份路径:${reset}${cloud_backup_dir}" else echo"${green}iCloud Drive备份路径:${reset}${cloud_backup_dir}" fi
if [ ! -d "${local_backup_dir}" ]; then echo"${red}本地备份路径不存在!${reset}" mkdir -p "${local_backup_dir}" echo"${green}自动创建本地备份路径:${reset}${local_backup_dir}" else echo"${green}本地备份路径:${reset}${cloud_backup_dir}" fi
if [ ! -d "${xcode_backup_database}" ]; then echo"${red}同步数据库路径不存在!${reset}" mkdir -p "${xcode_backup_database}" echo"${green}自动创建数据库路径:${reset}${local_backup_dir}" else echo"${green}数据库路径:${reset}${cloud_backup_dir}" fi
sqlite3 "${database}"'create table if not exists backupXcode(id integer primary key not NULL,key integer unique not NULL,value integer not NULL);'
#获取最后修改时间 cd"${xcode_dir}" if [ -d "./${code_snippets}" ]; then find "./${code_snippets}" -type f >> ${temp} fi if [ -d "./${font_and_color_themes}" ]; then find "./${font_and_color_themes}" -type f >> ${temp} fi if [ -d "./${key_bindings}" ]; then find "./${key_bindings}" -type f >> ${temp} fi
whileread path; do key=`md5 -q -s "${path}"` value=`stat -f "%m""${path}"` isModify=`sqlite3 "${database}""select value from backupXcode where key == '${key}';"` if [ -z ${isModify} ]; then echo"${yellow}本地Xcode配置尚未同步${reset}!" num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -ge 1 ]; then echo"${green}找到最新的Xcode配置,开始自动替换${reset}!"
cd"${xcode_dir}" ## backup before zip -r "XcodeBackup.zip""${code_snippets}""${font_and_color_themes}""${key_bindings}" & wait
cd"${cloud_backup_dir}" newBackup=`ls -t | head -1`
unzip -u "${newBackup}" -d "${xcode_dir}" & wait
cd"${xcode_dir}" rm${temp} if [ -d "./${code_snippets}" ]; then find "./${code_snippets}" -type f >> ${temp} fi if [ -d "./${font_and_color_themes}" ]; then find "./${font_and_color_themes}" -type f >> ${temp} fi if [ -d "./${key_bindings}" ]; then find "./${key_bindings}" -type f >> ${temp} fi echo 更新数据库... whileread path; do key=`md5 -q -s "${path}"` value=`stat -f "%m""${path}"` sqlite3 "${database}""insert or replace into backupXcode values(NULL,'${key}',${value});" & done < ${temp} fi break fi if [ ${isModify} != ${value} ]; then if [ ${isModify} -gt ${value} ]; then echo"${yellow}本地Xcode配置超前${reset}!" else echo"${yellow}本地Xcode配置已经过期${reset}!"
num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -ge 1 ]; then echo"${green}找到最新的Xcode配置,开始自动替换${reset}!"
cd"${xcode_dir}" ## backup before zip -r "XcodeBackup.zip""${code_snippets}""${font_and_color_themes}""${key_bindings}" & wait
cd"${cloud_backup_dir}" newBackup=`ls -t | head -1`
unzip -o "${newBackup}" -d "${xcode_dir}" & wait fi fi cd"${xcode_dir}" rm${temp} if [ -d "./${code_snippets}" ]; then find "./${code_snippets}" -type f >> ${temp} fi if [ -d "./${font_and_color_themes}" ]; then find "./${font_and_color_themes}" -type f >> ${temp} fi if [ -d "./${key_bindings}" ]; then find "./${key_bindings}" -type f >> ${temp} fi echo 更新数据库... whileread path; do key=`md5 -q -s "${path}"` value=`stat -f "%m""${path}"` sqlite3 "${database}""insert or replace into backupXcode values(NULL,'${key}',${value});" done < ${temp} break fi done < ${temp}
wait rm${temp}
# zip files cd"${xcode_dir}" zip -r "${cloud_backup_dir}/XcodeBackup+${now}.zip""${code_snippets}""${font_and_color_themes}""${key_bindings}" & zip -r "${local_backup_dir}/XcodeBackup+${now}.zip""${code_snippets}""${font_and_color_themes}""${key_bindings}" &
wait
# delete unnecessary backup files num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr${num} - 5` cd"${cloud_backup_dir}" ls -tr"${cloud_backup_dir}" | head -${num} | xargs rm fi
num=`ls -l "${local_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr${num} - 5` cd"${local_backup_dir}" ls -tr"${local_backup_dir}" | head -${num} | xargs rm fi